Sealed Classes用來限制類別的繼承關係 這表示Sealed Classes能繼承的子類別數量是有限的
某種意義上是enum的擴展
使用sealed關鍵字宣告Sealed Classes,Sealed Classes可以有子類別但是需要跟Sealed Classes在同一份.kt檔上
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
Sealed Classes本身是一個abstract 不能被實例化但可以有abstract members.
Sealed Classes的建構子都是private的
Sealed Classes的好處在於使用when時 如果可以匹配所有的條件式就不需使用else
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
// the `else` clause is not required because we've covered all the cases
}